﻿using System;
using System.Drawing;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Banana ban = new Banana();
            ban.Eat();

            Haa swe = new Haa();
            swe.Sweet();
        }
    }

    //类的访问修饰符和修饰符
    public abstract class Fruit //没有限制的公开的;abstract定义抽象类，不能实例化，派生与该基类的方法必须重写
    {
        //字段


        /// <summary>
        /// 
        /// 被static修饰的字段只指明一个存储位置，无论创建多少个实例对象，只能获得最原始的那个静态字段副本
        /// 用readonly修饰符声明只读字段
        /// </summary>
        public static readonly Apple apple = new Apple();



        public int color;//公开，没有限制
        private double size;//只能在当前类中使用
        internal double money;//默认，本项目中使用（当前程序集）
        protected double weight;//当前类，或者是派生与该类的类使用




        //属性
        public int Color { get { return color; }set { color = value; } }
        public double Size { get { return size; } set { size = value; } }
        public double Money { get; set; }
        public double Weight { get; set; }



        public abstract void Eat();//声明了抽象类才能定义抽象方法，没有方法体，继承该类的派生类必须重写该方法


    }


    internal sealed class Pet//只能在本项目中使用（当前程序集），默认情况下就是internal；有sealed关键字就不能被继承
    {
       
    }

    public class Apple
    {

    }


    class Banana : Fruit
    {
        public override void Eat()
        {
            Console.WriteLine("香蕉很好吃");
        }
        public virtual void Sweet()//虚方法，抽象方法没有办法实现虚方法的
        {

        }
    }



    class Haa : Banana//单继承
    {
        public override void Sweet()//override修饰符，可以重写继承与基类的virtual修饰的虚方法
        {
            Console.WriteLine("香蕉很甜，哈哈哈");
        }
    }
}
